package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import play.db.DB;

import utils.exceptions.BDException;
import models.Administrador;
import models.Aluno;
import arq.SigcfcArq;

public class AlunoDAO {
	Connection conexao;

	public AlunoDAO() {
		conexao = DB.getConnection();
	}

	public boolean cadastrarAluno(Aluno _aluno) throws BDException {
		boolean retorno = false;

		String comando = "insert into aluno (cpf, nome, nascimento, rg, cep, cidade, estado, rua, numero, bairro, complemento, telefone1, telefone2, email, login, senha, matricula, data_matricula, cod_turma" +
				"" +
				")"
				+ "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

		try {
			PreparedStatement stmt = conexao.prepareStatement(comando);

			stmt.setLong(1, _aluno.getCpf());
			stmt.setString(2, _aluno.getNome());
			stmt.setDate(3, SigcfcArq.converterDateUtil2Sql(_aluno.getDataNascimento()));
			stmt.setLong(4, _aluno.getRg());
			stmt.setLong(5, _aluno.getCep());
			stmt.setString(6, _aluno.getCidade());
			stmt.setString(7, _aluno.getEstado());
			stmt.setString(8, _aluno.getRua());
			stmt.setInt(9, _aluno.getNumero());
			stmt.setString(10, _aluno.getBairro());
			stmt.setString(11, _aluno.getComplemento());
			stmt.setLong(12, _aluno.getTelefone1());
			stmt.setLong(13, _aluno.getTelefone2());
			stmt.setString(14, _aluno.getEmail());
			stmt.setString(15, _aluno.getLogin());
			stmt.setString(16, _aluno.getSenha());
			stmt.setLong(17, _aluno.getMatricula());
			stmt.setDate(18, SigcfcArq.converterDateUtil2Sql(_aluno.getDataMatricula()));
			stmt.setLong(19, _aluno.getCodTurma());

			stmt.execute();
			stmt.close();
			retorno = true;
		} catch (SQLException e) {
			throw new BDException("Ocorreu erro ao INSERIR o Aluno.",e.getStackTrace());
		}

		return retorno;
	}

	public boolean editar(Aluno _aluno) throws BDException {

		boolean retorno = false;

		String comando = "update aluno set cpf=?, nome=?, nascimento=?, rg=?, cep=?, cidade=?, estado=?, rua=?, numero=?, bairro=?, complemento=?, telefone1=?, telefone2=?, email=?, login=?, senha=?, matricula=?, data_matricula=?, cod_turma=?, nota1=?, nota2=? where idaluno=?";

		try {
			PreparedStatement stmt = conexao.prepareStatement(comando);
			
			stmt.setLong(1, _aluno.getCpf());
			stmt.setString(2, _aluno.getNome());
			stmt.setDate(3, SigcfcArq.converterDateUtil2Sql(_aluno.getDataNascimento()));
			stmt.setLong(4, _aluno.getRg());
			stmt.setLong(5, _aluno.getCep());
			stmt.setString(6, _aluno.getCidade());
			stmt.setString(7, _aluno.getEstado());
			stmt.setString(8, _aluno.getRua());
			stmt.setInt(9, _aluno.getNumero());
			stmt.setString(10, _aluno.getBairro());
			stmt.setString(11, _aluno.getComplemento());
			stmt.setLong(12, _aluno.getTelefone1());
			stmt.setLong(13, _aluno.getTelefone2());
			stmt.setString(14, _aluno.getEmail());
			stmt.setString(15, _aluno.getLogin());
			stmt.setString(16, _aluno.getSenha());
			stmt.setLong(17, _aluno.getMatricula());
			stmt.setDate(18, SigcfcArq.converterDateUtil2Sql(_aluno.getDataMatricula()));
			stmt.setLong(19, _aluno.getCodTurma());
			stmt.setLong(20, _aluno.getNota1());
			stmt.setLong(21, _aluno.getNota2());
			stmt.setLong(22, _aluno.getIdAluno());
			
			stmt.execute();
			stmt.close();
			
			retorno = true;
		} catch (SQLException e) {
			throw new BDException("Ocorreu erro ao EDITAR o Aluno.",e.getStackTrace());
		}

		return retorno;

	}

	public List<Aluno> listarTodos() throws BDException {
		List<Aluno> alunos = new ArrayList<Aluno>();

		String comando = "select * from aluno order by nome;";

		try {
			java.sql.Statement stmt = conexao.createStatement();
			ResultSet rs = stmt.executeQuery(comando);

			while (rs.next()) {
				Aluno aluno = new Aluno();

				aluno.setIdAluno(rs.getLong("idaluno"));
				aluno.setCpf(rs.getLong("cpf"));
				aluno.setNome(rs.getString("nome"));
				aluno.setRg(rs.getLong("rg"));
				aluno.setDataNascimento(SigcfcArq.converterDateSql2Util(rs.getDate("nascimento")));
				aluno.setCep(rs.getLong("cep"));
				aluno.setCidade(rs.getString("cidade"));
				aluno.setEstado(rs.getString("estado"));
				aluno.setRua(rs.getString("rua"));
				aluno.setNumero(rs.getInt("numero"));
				aluno.setBairro(rs.getString("bairro"));
				aluno.setComplemento(rs.getString("complemento"));
				aluno.setTelefone1(rs.getLong("telefone1"));
				aluno.setTelefone2(rs.getLong("telefone2"));
				aluno.setEmail(rs.getString("email"));
				aluno.setLogin(rs.getString("login"));
				aluno.setMatricula(rs.getLong("matricula"));
				aluno.setDataMatricula(SigcfcArq.converterDateSql2Util(rs.getDate("data_matricula")));
				aluno.setCodTurma(rs.getLong("cod_turma"));
				aluno.setNota1(rs.getLong("nota1"));
				aluno.setNota2(rs.getLong("nota2"));

				alunos.add(aluno);
			}
			stmt.close();
		} catch (SQLException e) {
			throw new BDException("Ocorreu erro ao LISTAR os Alunos.",e.getStackTrace());
		}
		return alunos;
	}
	
	public List<Aluno> listarTodosProf(long idAula) throws BDException {
		List<Aluno> alunos = new ArrayList<Aluno>();

		String comando = "select alu.cpf, alu.nota1, alu.nota2, alu.idaluno, alu.nome, alu.matricula, alu.cod_turma " +
						  "from aula au, aula_tem_turma atu, turma t, aluno alu " +
						  "where '"+idAula+"'=atu.idAula " +
						  "and au.codDisc=atu.codDisc " +
						  "and atu.idTurma=t.idTurma " +
						  "and t.codTurma=alu.cod_turma";
			
		try {
			java.sql.Statement stmt = conexao.createStatement();
			ResultSet rs = stmt.executeQuery(comando);

			while (rs.next()) {
				Aluno aluno = new Aluno();
				aluno.setNota1(rs.getLong("nota1"));
				aluno.setNota2(rs.getLong("nota2"));
				aluno.setIdAluno(rs.getLong("idaluno"));				
				aluno.setNome(rs.getString("nome"));
				aluno.setMatricula(rs.getLong("matricula"));
				aluno.setCodTurma(rs.getLong("cod_turma"));
				aluno.setCpf(rs.getLong("cpf"));
				alunos.add(aluno);
			}
			stmt.close();
		} catch (SQLException e) {
			throw new BDException("Ocorreu erro ao LISTAR os Alunos.",e.getStackTrace());
		}
		return alunos;
	}

	public boolean excluir(long _cpfAluno) throws BDException {

		boolean retorno = false;

		String comando = "delete from aluno where cpf=?;";
		try {
			PreparedStatement stmt = conexao.prepareStatement(comando);
			stmt.setLong(1, _cpfAluno);

			stmt.execute();
			stmt.close();
			retorno = true;
		} catch (SQLException e) {
			throw new BDException("Ocorreu erro ao EXCLUIR um Aluno.",e.getStackTrace());
		}

		return retorno;
	}

	public Aluno buscarAluno(long _cpf) throws BDException {
		String comando = "select * from aluno where cpf='"+_cpf+"'";

		Aluno aluno = new Aluno();
		try {
			java.sql.Statement stmt = conexao.createStatement();
			ResultSet rs = stmt.executeQuery(comando);

			while (rs.next()) {

				aluno.setIdAluno(rs.getLong("idaluno"));
				aluno.setCpf(rs.getLong("cpf"));
				aluno.setNome(rs.getString("nome"));
				aluno.setRg(rs.getLong("rg"));
				aluno.setDataNascimento(SigcfcArq.converterDateSql2Util(rs.getDate("nascimento")));
				aluno.setCep(rs.getLong("cep"));
				aluno.setCidade(rs.getString("cidade"));
				aluno.setEstado(rs.getString("estado"));
				aluno.setRua(rs.getString("rua"));
				aluno.setNumero(rs.getInt("numero"));
				aluno.setBairro(rs.getString("bairro"));
				aluno.setComplemento(rs.getString("complemento"));
				aluno.setTelefone1(rs.getLong("telefone1"));
				aluno.setTelefone2(rs.getLong("telefone2"));
				aluno.setEmail(rs.getString("email"));
				aluno.setLogin(rs.getString("login"));
				aluno.setSenha(rs.getString("senha"));
				aluno.setMatricula(rs.getLong("matricula"));
				aluno.setDataMatricula(SigcfcArq.converterDateSql2Util(rs.getDate("data_matricula")));
				aluno.setCodTurma(rs.getLong("cod_turma"));
				aluno.setNota1(rs.getLong("nota1"));
				aluno.setNota2(rs.getLong("nota2"));

			}

			stmt.close();
		} catch (SQLException e) {
			throw new BDException("Ocorreu erro ao BUSCAR o Aluno.",e.getStackTrace());
		}
		return aluno;
	}
	
	public Aluno buscarAlunoLogin(String login, String senha) throws BDException {		
		Aluno alu = new Aluno();		
		String comando = "select * from aluno where login = '"+login+"' and senha = '"+senha+"'";				
		try {
			java.sql.Statement start = conexao.createStatement();
			ResultSet rs = start.executeQuery(comando);			
			while(rs.next()){	
				alu.setNome(rs.getString("nome"));
				alu.setCpf(rs.getLong("cpf"));
				alu.setLogin(rs.getString("login"));
				alu.setSenha(rs.getString("senha"));						
			}			
		} catch (SQLException e) {
			throw new BDException("Ocorreu erro na hora de BUSCAR a Adm (try catch)",e.getStackTrace());
		}		
		return alu;
	}
	
}
